#include "metadata.h"
#include "datasuite.h"


#include <QList>
#include <QStringList>
#include <QTimer>


MetaData::MetaData(QObject *parent) :
    QObject(parent),
    d(new Data())
{
}

MetaData::MetaData(const MetaData &other) :
    QObject(other.parent()),
    d(other.d)
{
}

QStringList MetaData::itemNames() const
{
    QStringList ret;
    foreach (MetaItem* item, d->items)
    {
        ret << item->name();
    }

    return ret;
}

QString MetaData::itemName(int index) const
{
    MetaItem* item = d->items.value(index, 0);
    if (!item)
    {
//        qDebug() << Q_FUNC_INFO << "- Item index not valid:" << index;
        return QString();
    }

    return item->name();
}

int MetaData::itemIndex(const QString &itemName)
{
    return itemNames().indexOf(itemName);
}

void MetaData::addItem(const QString &name)
{
//    qDebug() << Q_FUNC_INFO;
    if (itemNames().contains(name))
    {
        return;
    }

    MetaItem* item = new MetaItem(this);
    item->setName(name);

    d->items << item;
    onUpdateItemNames();
}

void MetaData::addItem(MetaItem *item)
{
    item->setParent(this);
    d->items << item;

    if (d->itemNames.contains(item->name()))
    {
        onReorderItems();
        return;
    }

    onUpdateItemNames();
}


void MetaData::moveForward(int index)
{
    int next = index + 1;
    if (index < 0 || next >= d->items.count())
    {
        return;
    }

    d->items.move(index, next);
    onUpdateItemNames();
}

void MetaData::moveBackward(int index)
{
    int prev = index - 1;
    if (prev < 0 || index >= d->items.count())
    {
        return;
    }

    d->items.move(index, prev);
    onUpdateItemNames();
}

void MetaData::reorderItems(const QStringList &itemNames)
{
    d->itemNames = itemNames;
    QTimer::singleShot(0, this, SLOT(onReorderItems()));
}

void MetaData::setItemName(int index, const QString &itemName)
{
    if (index < 0 || index >= d->items.count())
    {
        return;
    }

    d->items.at(index)->setName(itemName);
    onUpdateItemNames();
}

DataSuite *MetaData::suite() const
{
    return qobject_cast<DataSuite*>(parent());
}

void MetaData::onReorderItems()
{
    qDebug() << Q_FUNC_INFO;
    foreach (QString name, d->itemNames)
    {
        int from = itemIndex(name);
        int to = d->itemNames.indexOf(name);
        if (from < 0 || from == to)
        {
            continue;
        }

        d->items.move(from, to);
    }
}

void MetaData::onUpdateItemNames()
{
    d->itemNames.clear();
    foreach (const MetaItem* item, d->items)
    {
        d->itemNames << item->name();
    }
}
